import { getToken, setToken, removeToken } from '@/utils/auth'
import { getUserProfileAPI, loginAPI, getUserPhotoAPI } from '@/api'
import { resetRouter } from '@/router'

const getDefaultState = () => {
  return {
    token: getToken(), // vuex的state值，使用本地持久化（刷新时默认去本地取一个）
    userInfo: {}, // 用户的基本资料对象
    name: '',
    avatar: ''
  }
}

const state = getDefaultState()

const mutations = {
  RESET_STATE: (state) => {
    Object.assign(state, getDefaultState())
  },
  SET_TOKEN: (state, token) => {
    state.token = token // state存一份
    setToken(token) // 给本地也存一份
  },
  SET_NAME: (state, name) => {
    state.name = name
  },
  SET_AVATAR: (state, avatar) => {
    state.avatar = avatar
  },
  // 删除token
  REMOVE_TOKEN(state) {
    state.token = ''
    removeToken()
  },
  // 操作userInfo
  // 设置用户名
  SET_USER(state, value) { // value 一会请求到的用户信息对象
    state.userInfo = value
  },
  // 删除用户信息
  REMOVE_USER(state) {
    state.userInfo = {}
  }
}

const actions = {
  // 封装的登录逻辑
  async loginActions({ commit }, data) {
    const res = await loginAPI(data)
    commit('SET_TOKEN', res.data)
    console.log(res)
    return res // 把结果返回到调用处
    // async函数return的值，
    // 只要不是Promise.reject()
    // 都会作为Promise成功的结果
  },
  // 封装获取用户信息
  async getUserInfoActions({ commit }) {
    const { data: userObj } = await getUserProfileAPI()
    const { data: photoObj } = await getUserPhotoAPI(userObj.userId)
    commit('SET_USER', { ...userObj, ...photoObj }) // 用户对象信息，交到mutations里保存到userInfo上
    return userObj.roles.menus // 返回页面权限点的英文字符串数组
  },
  // 封装退出登录的逻辑
  logoutActions({ commit }) {
    commit('REMOVE_TOKEN')
    commit('REMOVE_USER')
    // state值清除，也会影响getters
    resetRouter() // 让内存里router重置
  }
}

export default {
  namespaced: true,
  state,
  mutations,
  actions
}
